﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DTO_MechSysWeb;
using System.Data.SqlClient;

namespace DAL_MechSysWeb
{
    public class DALCliente : DALBase
    {
        private DTOCliente CriarCliente(SqlDataReader sqlDataReader)
        {
            try
            {
                DTOCliente dtoCliente = new DTOCliente();

                if (!string.IsNullOrEmpty(sqlDataReader["ClienteID"].ToString()))
                {
                    dtoCliente.ClienteID = (int)sqlDataReader["ClienteID"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Nome"].ToString()))
                {
                    dtoCliente.Nome = (string)sqlDataReader["Nome"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Sobrenome"].ToString()))
                {
                    dtoCliente.Sobrenome = (string)sqlDataReader["Sobrenome"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Sexo"].ToString()))
                {
                    dtoCliente.Sexo = Convert.ToChar(sqlDataReader["Sexo"]);
                }

                if (!string.IsNullOrEmpty(sqlDataReader["CPF"].ToString()))
                {
                    dtoCliente.CPF = (string)sqlDataReader["CPF"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["DataNascimento"].ToString()))
                {
                    dtoCliente.DataNascimento = (DateTime)sqlDataReader["DataNascimento"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Telefone"].ToString()))
                {
                    dtoCliente.Telefone = (string)sqlDataReader["Telefone"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Celular"].ToString()))
                {
                    dtoCliente.Celular = (string)sqlDataReader["Celular"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Email"].ToString()))
                {
                    dtoCliente.Email = (string)sqlDataReader["Email"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Login"].ToString()))
                {
                    dtoCliente.Login = (string)sqlDataReader["Login"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["UserID"].ToString()))
                {
                    dtoCliente.UserID = sqlDataReader["UserID"].ToString();
                }

                if (!string.IsNullOrEmpty(sqlDataReader["EnderecoID"].ToString()))
                {
                    dtoCliente.EnderecoID = (int)sqlDataReader["EnderecoID"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Informacoes"].ToString()))
                {
                    dtoCliente.Informacoes = (bool)sqlDataReader["Informacoes"];
                }

                try
                {
                    if (!string.IsNullOrEmpty(sqlDataReader["ImagemPerfil"].ToString()))
                    {
                        dtoCliente.ImagemPerfil = (byte[])sqlDataReader["ImagemPerfil"];
                    }
                }
                catch { }

                try
                {
                    if (!string.IsNullOrEmpty(sqlDataReader["ImagemTipo"].ToString()))
                    {
                        dtoCliente.ImagemTipo = (string)sqlDataReader["ImagemTipo"];
                    }
                }
                catch { }

                return dtoCliente;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void Inserir(DTOCliente dtoCliente)
        {
            try
            {
                string storedProssidere = "sp_Web_InserirCliente";
                SqlParameter[] parameters =
                
                {      
                   new SqlParameter("@nome", dtoCliente.Nome),
                   new SqlParameter("@sobrenome", dtoCliente.Sobrenome),
                   new SqlParameter("@sexo", dtoCliente.Sexo),
                   new SqlParameter("@cpf", dtoCliente.CPF),
                   new SqlParameter("@dataNascimento", dtoCliente.DataNascimento),
                   new SqlParameter("@telefone", dtoCliente.Telefone),                       
                   new SqlParameter("@celular", dtoCliente.Celular),
                   new SqlParameter("@userID", dtoCliente.UserID),
                   new SqlParameter("@email", dtoCliente.Email),
                   new SqlParameter("@login", dtoCliente.Login),
                   new SqlParameter("@enderecoID", dtoCliente.EnderecoID),
                   new SqlParameter("@informacoes", dtoCliente.Informacoes),
                   new SqlParameter("@registroWeb", dtoCliente.RegistroWeb),
                   new SqlParameter("@imagemPerfil", dtoCliente.ImagemPerfil),
                   new SqlParameter("@imagemTipo", dtoCliente.ImagemTipo),
                   new SqlParameter("@dataRegistro", DateTime.Now)

                };
                ExecuteNonQuery(storedProssidere, parameters);

            }

            catch (SqlException)
            {
                throw;
            }
        }

        public void Atualizar(DTOCliente dtoCliente)
        {
            try
            {
                string storedProssidere = "sp_Web_AtualizarCliente";
                SqlParameter[] parameters =

                        {                    
                           new SqlParameter("@clienteID", dtoCliente.ClienteID),
                           new SqlParameter("@nome", dtoCliente.Nome),
                           new SqlParameter("@sobrenome", dtoCliente.Sobrenome),
                         new SqlParameter("@sexo", dtoCliente.Sexo),
                          new SqlParameter("@cpf", dtoCliente.CPF),
                   new SqlParameter("@dataNascimento", dtoCliente.DataNascimento),
                          new SqlParameter("@telefone", dtoCliente.Telefone),                       
                   new SqlParameter("@celular", dtoCliente.Celular),
                   new SqlParameter("@userID", dtoCliente.UserID),
                   new SqlParameter("@email", dtoCliente.Email),
                   new SqlParameter("@login", dtoCliente.Login),
                          new SqlParameter("@enderecoID", dtoCliente.EnderecoID),
                   new SqlParameter("@informacoes", dtoCliente.Informacoes),
                   new SqlParameter("@registroWeb", dtoCliente.RegistroWeb),
                          new SqlParameter("@imagemPerfil", dtoCliente.ImagemPerfil),
                   new SqlParameter("@imagemTipo", dtoCliente.ImagemTipo),
                   new SqlParameter("@dataRegistro", DateTime.Now) 
                        };
                ExecuteNonQuery(storedProssidere, parameters);

            }

            catch (SqlException)
            {
                throw;
            }
        }

        public void Excluir(int clienteID)
        {
            try
            {
                string storedProssidere = "sp_ExcluirCliente";
                SqlParameter[] parameters =

                        {                    
                           new SqlParameter("@clienteID", clienteID)                                    
                        };
                ExecuteNonQuery(storedProssidere, parameters);

            }

            catch (SqlException)
            {
                throw;
            }
        }        

        public bool VerificaSeEmailExiste(string email)
        {
            bool Existe = false;

            try
            {
                string storedProcedure = "sp_Web_VerificaSeEmailExiste";

                SqlParameter[] parameters =
            {
                new SqlParameter("@email", email)                            
            };

                using (SqlDataReader sqlDataReader = ExecuteReader(storedProcedure, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        int NumReg = (int)sqlDataReader["NumeroRegistros"];
                        if (NumReg > 0)
                        {
                            Existe = true;
                        }

                    }
                }
                return Existe;

            }
            catch (Exception)
            {
                throw;
            }

        }

        public bool VerificaSeLoginExiste(string login)
        {
            bool Existe = false;

            try
            {
                string storedProcedure = "sp_Web_VerificaSeLoginExiste";

                SqlParameter[] parameters =
            {
                new SqlParameter("@login", login),                            
            };

                using (SqlDataReader sqlDataReader = ExecuteReader(storedProcedure, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        int NumReg = (int)sqlDataReader["NumeroRegistros"];
                        if (NumReg > 0)
                        {
                            Existe = true;
                        }

                    }
                }
                return Existe;

            }
            catch (Exception)
            {
                throw;
            }

        }

        public bool VerificaSeClienteExistePorCPF(string cpf)
        {
            bool Existe = false;

            try
            {
                string storedProcedure = "SELECT Count(*)as NumeroRegistros FROM Cliente WHERE CPF = @cpf";

                SqlParameter[] parameters =
            {
                new SqlParameter("@cpf", cpf)                            
            };

                using (SqlDataReader sqlDataReader = ExecuteReaderQuery(storedProcedure, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        int NumReg = (int)sqlDataReader["NumeroRegistros"];
                        if (NumReg > 0)
                        {
                            Existe = true;
                        }

                    }
                }
                return Existe;

            }
            catch (Exception)
            {
                throw;
            } 
        }

        public bool VerificaSePossuiCadastroWeb(string cpf)
        {
            bool Existe = false;

            try
            {
                string storedProcedure = "SELECT Count(*) as NumeroRegistros FROM Cliente WHERE CPF = @cpf AND RegistroWeb = 'True'";

                SqlParameter[] parameters =
            {
                new SqlParameter("@cpf", cpf)                            
            };

                using (SqlDataReader sqlDataReader = ExecuteReaderQuery(storedProcedure, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        int NumReg = (int)sqlDataReader["NumeroRegistros"];
                        if (NumReg > 0)
                        {
                            Existe = true;
                        }

                    }
                }
                return Existe;

            }
            catch (Exception)
            {
                throw;
            }
        }

        public int BuscarUltimoClienteID()
        {
            try
            {
                int idCorrente = -1;

                string storedProssidere = "sp_BuscarUltimoClienteID";

                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere))
                {
                    if (sqlDataReader.Read())
                    {
                        idCorrente = Int32.Parse(sqlDataReader["IDCorrente"].ToString());
                    }
                }

                return idCorrente;
            }
            catch (SqlException)
            {
                throw;
            }
        }

        public string BuscarClienteNomePorUserID(string userID)
        {
            string clienteNome = "";

            try
            {
                string sqlQuery = "SELECT Nome FROM Cliente WHERE UserID = @userID";
                SqlParameter[] parameters =
                        {                    
                           new SqlParameter("@userID", userID)                                    
                        };
                using (SqlDataReader sqlDataReader = ExecuteReaderQuery(sqlQuery, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        if (!string.IsNullOrEmpty(sqlDataReader["Nome"].ToString()))
                        {
                            clienteNome = (string)sqlDataReader["Nome"];
                        }

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }

            return clienteNome;
        }

        public string BuscarClienteNomePorClienteID(int clienteID)
        {
            string clienteNome = "";

            try
            {
                string sqlQuery = "SELECT ClienteID, Nome, Sobrenome FROM Cliente WHERE ClienteID = @clienteID";
                SqlParameter[] parameters =
                        {                    
                           new SqlParameter("@clienteID", clienteID)                                    
                        };
                using (SqlDataReader sqlDataReader = ExecuteReaderQuery(sqlQuery, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        if (!string.IsNullOrEmpty(sqlDataReader["Nome"].ToString()))
                        {
                            clienteNome = (string)sqlDataReader["Nome"];
                        }

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }

            return clienteNome;
        }

        public int BuscarClienteIDPorUserID(string userID)
        {
            int clienteNome = 0;

            try
            {
                string sqlQuery = "SELECT ClienteID FROM Cliente WHERE UserID = @userID";
                SqlParameter[] parameters =
                        {                    
                           new SqlParameter("@userID", userID)                                    
                        };
                using (SqlDataReader sqlDataReader = ExecuteReaderQuery(sqlQuery, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        if (!string.IsNullOrEmpty(sqlDataReader["ClienteID"].ToString()))
                        {
                            clienteNome = (int)sqlDataReader["ClienteID"];
                        }

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }

            return clienteNome;
        }      

        public DTOCliente BuscarClientePorUserID(string userID)
        {
            DTOCliente dtoCliente = null;

            try
            {
                string storedProssidere = "sp_Web_BuscarClientePorUserID";
                SqlParameter[] parameters =
                        {                    
                           new SqlParameter("@userID", userID)                                    
                        };
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    if (sqlDataReader.Read())
                    {

                        dtoCliente = CriarCliente(sqlDataReader);

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }

            return dtoCliente;
        }

        public DTOCliente BuscarClientePorClienteID(int clienteID)
        {
            DTOCliente dtoCliente = null;

            try
            {
                string storedProssidere = "sp_Web_BuscarClientePorClienteID";
                SqlParameter[] parameters =
                        {                    
                           new SqlParameter("@clienteID", clienteID)                                    
                        };
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    if (sqlDataReader.Read())
                    {

                        dtoCliente = CriarCliente(sqlDataReader);

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }

            return dtoCliente;
        }

        public DTOCliente BuscarClientePorCPF(string cpf)
        {
            DTOCliente dtoCliente = null;

            try
            {
                string storedProssidere = @"SELECT ClienteID, Nome, Sobrenome, Sexo, CPF, DataNascimento, Telefone, Celular, Email, 
                                        Login, UserID, EnderecoID, Informacoes, ImagemPerfil, ImagemTipo FROM Cliente WHERE CPF = @cpf";
                SqlParameter[] parameters =
                        {                    
                           new SqlParameter("@cpf", cpf)                                    
                        };
                using (SqlDataReader sqlDataReader = ExecuteReaderQuery(storedProssidere, parameters))
                {
                    if (sqlDataReader.Read())
                    {

                        dtoCliente = CriarCliente(sqlDataReader);

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }

            return dtoCliente;
        }

        public List<DTOCliente> BuscarClientesCadastradosWeb()
        {
            List<DTOCliente> lstClientes = new List<DTOCliente>();

            try
            {
                string storedProssidere = "sp_Web_BuscarClientesCadastradosWeb";

                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere))
                {
                    while (sqlDataReader.Read())
                    {
                        DTOCliente dtoCliente = CriarCliente(sqlDataReader);

                        lstClientes.Add(dtoCliente);

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }

            return lstClientes;
        }      

    }
}
